#include <stdio.h>
#define BASE_YEAR        1970 // 定义基准年
#define BASE_DAY_OF_WEEK 4    // 定义基准年1月1日是星期几

// 判断某年是否是闰年
int is_leap(int year)
{
	return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
}

// 获取某年的某月有多少天
int get_days(int year, int month)
{
	if (4 == month || 6 == month || 9 == month || 11 == month) {
		return 30;
	} else if (2 == month) {
		return is_leap(year) ? 29 : 28;
	} else {
		return 31;
	}
}

int main(void)
{
	int year, month, i;
	int day = 0;
	int day_of_week;

	printf("请输入年月：");
	scanf("%d%d", &year, &month);

	// 累加目标年到基准年中完整的年所包含的天数
	for (i = BASE_YEAR; i < year; i++) {
		day += is_leap(i) ? 366 : 365;
	}

	// 累加目标年中该月之前完整的月包含的天数
	for (i = 1; i < month; i++) {
		day += get_days(year, i);
	}

	// 0到6表示周日到周六
	day_of_week = (day + BASE_DAY_OF_WEEK) % 7;

	// 输出日历头
	printf("     %d年 %d月\n", year, month);
	printf("日 一 二 三 四 五 六\n");
	// 补齐第一个日期前的空格
	for (i = 0; i < day_of_week % 7; i++) {
		printf("   ");
	}
	// 输出每个日期
	for (i = 1; i <= get_days(year, month); i++) {
		printf("%2d ", i);

		if ((i + day_of_week) % 7 == 0) {
			printf("\n");
		}
	}
	printf("\n");

	return 0;
}
